home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s_tool / scsisub.c < prev    next >
Text File  |  1999-06-29  |  21KB  |  966 lines

  1. #include    "JX250.H"
  2. #include    <sys\iocs.h>
  3. #include    <sys\dos.h>
  4. #include    <sys\scsi.h>
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <math.h>
  9.  
  10.  
  11. #define    SCERR 1
  12.  
  13. #define QQ0(A) ( (A)>>4 )
  14. #define QQ1(A) ( ((A)>>4)+(((A)>=0x1F0||((A)&0xF)<8)?0:1) )
  15.  
  16. #define OVERS (2)
  17.  
  18. UNchar    RG_[256];
  19. UNchar    GG_[256];
  20. UNchar    BG_[256];
  21.  
  22. UNshort    RG0[256];
  23. UNshort    GG0[256];
  24. UNshort    BG0[256];
  25. UNshort    RG1[256];
  26. UNshort    GG1[256];
  27. UNshort    BG1[256];
  28.  
  29. int    DataMd;
  30. int    DataX,DataY;        // 画像データのサイズ
  31. int    DataC;
  32. int    PreDataMd;
  33.  
  34. /**************************************************
  35.         スキャン
  36.     スキャンします
  37.     スキャナを初期化します
  38.     1/1200inch に設定します
  39.     pr=0 でプリスキャンします
  40.     pr に格納アドレス。サイズを間違えないよう。
  41. [out]   -1;その他のエラー
  42.     -2;SCSI エラー
  43.     -3;パラメータエラー
  44.     -4;メモリ足りないエラー
  45.     -9;中断
  46.     -99;ダイアログなしエラー(Scan() でエラー表示しちゃってる)
  47.     0;正常
  48. **************************************************/
  49. int    Scan(pr,id)
  50. int    id;
  51. UNchar    *pr;
  52. {
  53. int    i,j,l,k,v,x,y,z,d,xxx,yyy,x_,y_;
  54. int    mm1,mm2,vs,scx,scy,ll;
  55. int    rr,gg,bb;
  56. int    md,mp;
  57. int    bx,by,oln;
  58. int    ssp;
  59. UNchar    *M,*N,*MM,*MC;
  60. UNshort    *MS;
  61. UNchar    buf[512];
  62. //---
  63. oln=0;
  64. bx=1;
  65. by=1;
  66. if ( pr!=0 ){
  67.     if ( ImageDirec==0 ){    // 0;縦 1;横
  68.         scx=ScanDotX/DOTB;
  69.         scy=ScanDotY/DOTB;
  70.     } else {
  71.         scx=ScanDotY/DOTB;
  72.         scy=ScanDotX/DOTB;
  73.     }
  74.     DataX=scx;
  75.     DataY=scy;
  76.     //printf("                    %d,%d  ",ScanDpiX/10000,ScanDpiY/10000);
  77.     if ( ScanDpiX<700000 || ScanDpiY<700000 ){
  78.         // X の DPI が小さいオーバーキャンするぞー
  79.         #if SCERR == 1
  80.             //printf("  overscan!!/n");
  81.         #endif
  82.         bx=2;
  83.         by=2;
  84.         scx*=bx;
  85.         scy*=by;
  86.     }
  87.     if ( ScanDpiX<140000 || ScanDpiY<140000 ){
  88.         return(-3);
  89.     }
  90.     if ( mat_vadds!=0 ){
  91.         if ( (ScanDotX/DOTB)>mat_xwidth || (ScanDotY/DOTB)>mat_ywidth ){
  92.             sprintf(buf,"(%d,%d)をこえています",mat_xwidth,mat_ywidth);
  93.             Dialog("マチエールの仮想画面サイズ",buf,"スキャン出来ません",1);
  94.             return(-99);
  95.         }
  96.     }
  97. } else{
  98.     bx=2;
  99.     by=1;
  100. }
  101. //=========== 初期化 発行
  102. BUSYS( i=_scsi_initialize(id) );
  103. if ( i!=0 ){
  104.     #if SCERR == 1
  105.         printf("initialize でエラー(%d)\n",i);
  106.     #endif
  107.     if ( i==2 ){
  108.         i=request_disp2(id);
  109.         sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  110.         Dialog("JX エラーがでました。","[init.]",buf,1 );
  111.         return(-99);
  112.     }
  113.     return(-2);
  114. }
  115. //=========== modeselect (n/inch の設定)発行
  116. if ( jxscanner!=_JX270_ ){
  117.     for(i=0;i<16;buf[i++]=0);
  118.     buf[4]=0x03;            // MODE PARAMETER MEASUREMENT UNIT PAGE
  119.     buf[5]=0x06;            // Page Length
  120.     buf[8]=0x04;            // 1/1200 inch 指定
  121.     buf[9]=0xB0;            // 
  122.     BUSYS( i=_scsi_modeselect(0x10,4+8,id,buf) );
  123.     if ( i!=0 ){
  124.         #if SCERR == 1
  125.             printf("modeselect でエラー(%d)\n",i);
  126.         #endif
  127.         if ( i==2 ){
  128.             i=request_disp2(id);
  129.             sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  130.             Dialog("JX エラーがでました。","[mode sel.]",buf,1 );
  131.             return(-99);
  132.         }
  133.         return(-2);
  134.     }
  135. } else {
  136.     ;// ☆ JX270 は modesense を持っていない!
  137. }
  138. //=========== get window 発行
  139. //printf("get window!!\n");
  140. if ( jxscanner==_JX330_  ){
  141.     BUSYS( i=_scsi_getwindow( id,0x37+8,buf) );
  142. } else if ( jxscanner==_JX270_ ){
  143.     // ☆ JX270 は getwindow は持っていない!
  144.     for(i=0;i<70;buf[i++]=0);
  145.  
  146.     buf[6]=0x33;
  147. //    buf[57]=0b01111000;
  148.  
  149.     buf[30]=0x80;
  150.     buf[31]=0x80;
  151.     buf[32]=0x80;
  152.     buf[33]=0x05;
  153.     buf[34]=0x08;
  154.     buf[37]=0x03;        //Padding
  155.  
  156.     buf[48]=0xFF;
  157.     buf[49]=0x09;
  158.     buf[50]=0x60;
  159.     buf[51]=0xFF;
  160.     buf[53]=0x03;
  161.     buf[54]=0x18;
  162.     buf[55]=0x01;
  163.     buf[56]=0x84;
  164.  
  165.     i=0;
  166. } else {
  167.     // JX250,JX350
  168.     BUSYS( i=_scsi_getwindow( id,0x44+8,buf) );
  169. }
  170. if ( i!=0 ){
  171.     #if SCERR == 1
  172.         printf("getwindow でエラー(%d)\n",i);
  173.     #endif
  174.     if ( i==2 ){
  175.         i=request_disp2(id);
  176.         sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  177.         Dialog("JX エラーがでました。","[get win.]",buf,1 );
  178.         return(-99);
  179.     }
  180.     return(-2);
  181. }
  182. //=========== set window 発行
  183. //printf("set window!!\n");
  184. buf[0]=0;
  185. buf[1]=0;
  186. if ( pr==0 ){
  187.     //==== プリスキャン
  188.     //--- 範囲設定
  189.     *(int*)&buf[14]=0;            // 読み取り位置
  190.     *(int*)&buf[18]=0;
  191.     *(int*)&buf[22]=10224;            // 読み取り幅    最大を設定
  192.     *(int*)&buf[26]=14064;            //        最大を設定
  193.     if ( jxscanner!=_JX270_ ){
  194.         i=232*2;                // DOT 指定
  195.         buf[49]=i/0x100;
  196.          buf[50]=i&0xFF;
  197.         i=480;                    // DOT 指定
  198.         buf[51]=i/0x100;
  199.          buf[52]=i&0xFF;
  200.         //--- モード設定
  201.         buf[48]&=nbit(2);            // 高速読み取り
  202.         if ( jxscanner==_JX250_ || jxscanner==_JX350_ )
  203.             buf[66]=0x80;            // ドラフト取り込み
  204.     } else {
  205.         // JX270
  206. //        *(int*)&buf[22]=5020;            // 読み取り幅    最大を設定
  207. //        *(int*)&buf[26]=7028;            //        最大を設定
  208.         i=232*2;                // DOT 指定
  209.         buf[53]=i/0x100;
  210.          buf[54]=i&0xFF;
  211.         i=480;                    // DOT 指定
  212.         buf[55]=i/0x100;
  213.          buf[56]=i&0xFF;
  214. //        *(short*)&buf[10]=300;
  215. //        *(short*)&buf[12]=300;
  216. //        buf[57]|=bit(3);            // 校正早く
  217.     }
  218. } else {
  219.     //==== 本スキャン
  220.     //--- 範囲設定
  221.     *(int*)&buf[14]=PreX1;            // 読み取り位置
  222.     *(int*)&buf[18]=PreY1;
  223.     *(int*)&buf[22]=(PreX2-1)-PreX1;    // 読み取り幅
  224.     *(int*)&buf[26]=(PreY2-1)-PreY1;    //
  225.     if ( jxscanner!=_JX270_ ){
  226.         i=scx;                    // DOT 指定
  227.         buf[49]=i/0x100;
  228.          buf[50]=i&0xFF;
  229.         i=scy;                    // DOT 指定
  230.         buf[51]=i/0x100;
  231.          buf[52]=i&0xFF;
  232.         //--- モード設定
  233.         if ( ScanSpeed==0 )
  234.             buf[48]|=bit(2);        // 精細読み取り
  235.         else    buf[48]&=nbit(2);        // 高速読み取り
  236.         if ( jxscanner==_JX250_ || jxscanner==_JX350_ )
  237.             buf[66]=0x00;            // 通常取り込み  nonドラフト
  238.     } else {
  239.         // JX270
  240.     //    i=scx;                    // DOT 指定
  241.     //    buf[53]=i/0x100;
  242.     //     buf[54]=i&0xFF;
  243.     //    i=scy;                    // DOT 指定
  244.     //    buf[55]=i/0x100;
  245.     //     buf[56]=i&0xFF;
  246.         *(short*)&buf[10]=(int)((double)ScanDpiX/DPIB);
  247.         *(short*)&buf[12]=(int)((double)ScanDpiY/DPIB);
  248.         buf[57]&=nbit(3);            // 校正精密に
  249.     }
  250. }
  251. //--- モード設定
  252. if ( ImageColMode==0 ){    // 0;多値 1;二値
  253.     buf[34]=0x08;                //
  254.     if ( ImageMode==0 )            // 0;カラー 1;白黒
  255.         md=0x05;            // モード フルカラー
  256.     else    md=0x02;            // グレイスケール
  257. } else {
  258.     buf[34]=0x01;                //
  259.     if ( ImageMode==0 )            // 0;カラー 1;白黒
  260.         md=0x03;            // カラー2値
  261.     else    md=0x00;            // 単純2値
  262. }
  263. buf[33]=md;
  264. buf[37]=0x80;                // RIF=1 Padding=0
  265. if ( jxscanner!=_JX270_ ){
  266.     if ( jxscanner==_JX250_ || jxscanner==_JX350_ ){
  267.         buf[71]=1;                // 補正なし
  268.         //buf[71]=0;                // ユーザーγ補正
  269.     }
  270.     //--- 各種
  271.     if ( jxscanner==_JX330_ ){
  272.         // JX330 範囲が違う
  273.         i=Bright;
  274.         i=i-128;
  275.         i/=32;
  276.         buf[30]=0x80+i;                // 濃度補正
  277.     } else {
  278.         buf[30]=Bright;                // 濃度補正
  279.     }
  280.     buf[48]&=0xCF;                // ドロップアウトカラー
  281.      buf[48]|=(DropColor<<4);        //
  282.     buf[53]=LightR/0x100;            // 明度R
  283.      buf[54]=LightR&0xFF;            //
  284.     buf[55]=LightG/0x100;            // 明度G
  285.      buf[56]=LightG&0xFF;            //
  286.     buf[57]=LightB/0x100;            // 明度B
  287.      buf[58]=LightB&0xFF;            //
  288.     buf[59]=LightM/0x100;            // 明度M
  289.      buf[60]=LightM&0xFF;            //
  290.     buf[31]=ThreM;                // しきい値 BW
  291.     if ( jxscanner==_JX250_ || jxscanner==_JX350_ || jxscanner==_JX270_ ){
  292.         buf[63]=ThreR;                // しきい値 R
  293.         buf[64]=ThreG;                // しきい値 G
  294.         buf[65]=ThreB;                // しきい値 B
  295.     }
  296. } else {
  297.     // JX270
  298.     ;
  299.     buf[37]=0x00;                // RIF=0 Padding=1
  300. }
  301. //--- 設定
  302. if ( jxscanner==_JX250_ || jxscanner==_JX350_ ){
  303.     BUSYS( i=_scsi_setwindow( id,0x44+8,buf) );
  304. } elif ( jxscanner==_JX270_ ){
  305.  
  306.     //    dumps(buf,70-10);
  307.  
  308.     BUSYS( i=_scsi_setwindow( id,0x3B,buf) );
  309. } else {
  310.     BUSYS( i=_scsi_setwindow( id,0x37+8,buf) );
  311. }
  312. if ( i!=0 ){
  313.     #if SCERR == 1
  314.         printf("setwindow でエラー(%d)\n",i);
  315.     #endif
  316.     if ( i==2 ){
  317.         i=request_disp2(id);
  318.         if ( (i&0xFF)==5 )
  319.             return(-3);
  320.         sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  321.         Dialog("JX エラーがでました。","[set win.]",buf,1 );
  322.         return(-99);
  323.     }
  324.     return(-2);
  325. }
  326. //=========== scan 発行
  327. //printf("scan!!\n");
  328. if ( jxscanner!=_JX270_ ){
  329.     BUSYS( i=_scsi_scan(id) );
  330.     if ( i!=0 ){
  331.         #if SCERR == 1
  332.             printf("scan でエラー(%d)\n",i);
  333.         #endif
  334.         if ( i==2 ){
  335.             i=request_disp2(id);
  336.             sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  337.             Dialog("JX エラーがでました。","[scan]",buf,1 );
  338.             return(-99);
  339.         }
  340.         return(-2);
  341.     }
  342. }
  343. //======= γ補正&減色データ制作
  344. MakeGammaTable(md);
  345. //=========== testunit 発行 busy 待ち
  346. while( (i=_scsi_testunit(id))==8 ){
  347.     if ( MS_RSW()!=0 ){
  348.         if ( Dialog("","中止しますか?","",2)==0 ){
  349.             // 中止
  350.             BUSYS( i=_scsi_initialize(id) );
  351.             return(-9);
  352.         }
  353.     } elif ( (_iocs_bitsns(0)&bit(1))!=0 ){
  354.         while( (_iocs_bitsns(0)&bit(1))!=0 );
  355.         if ( Dialog("","中止しますか?","",2)==0 ){
  356.             // 中止
  357.             BUSYS( i=_scsi_initialize(id) );
  358.             return(-9);
  359.         }
  360.     }
  361. }
  362. if ( i!=0 ){
  363.     #if SCERR == 1
  364.         printf("testunit でエラー(%d)\n",i);
  365.     #endif
  366.     if ( i==2 ){
  367.         i=request_disp2(id);
  368.         sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  369.         Dialog("JX エラーがでました。","[testunit]",buf,1 );
  370.         return(-99);
  371.     }
  372.     return(-2);
  373. }
  374. //=========== read 繰り返し
  375. //----- 主走査,副走査のドット得る
  376. if ( jxscanner!=_JX270_ ){
  377.     BUSYS( i=_scsi_scanread( id,0x81,0,4,buf) );
  378.     if ( i!=0 ){
  379.         #if SCERR == 1
  380.             printf("read でエラー(%d)\n",i);
  381.         #endif
  382.         if ( i==2 ){
  383.             i=request_disp2(id);
  384.             sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  385.             Dialog("JX エラーがでました。","[read]",buf,1 );
  386.             return(-99);
  387.         }
  388.         return(-2);
  389.     }
  390.     x=buf[1]*0x100+buf[0];
  391.     y=buf[3]*0x100+buf[2];
  392. } else {
  393.     //BUSYS( i=_scsi_scanread27( id,0x20,0x0A0D,0x7,buf) );
  394.     BUSYS( i=_scsi_scanread( id,0x80,0x0A0D,7,buf) );
  395.     if ( i!=0 ){
  396.         #if SCERR == 1
  397.             printf("read でエラー(%d)\n",i);
  398.         #endif
  399.         if ( i==2 ){
  400.             i=request_disp2(id);
  401.             sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  402.             Dialog("JX エラーがでました。","[read]",buf,1 );
  403.             return(-99);
  404.         }
  405.         return(-2);
  406.     }
  407.     //x=*(int*)&buf[0];
  408.     //y=*(int*)&buf[4];
  409.     x=buf[3]*0x100+buf[4];
  410.     y=buf[5]*0x100+buf[6];
  411.     x=232*2;
  412.     y=480;
  413. }
  414. if ( pr==0 ){
  415.     if ( x!=232*2 || y!=480 ){
  416.         #if SCERR == 1
  417.             printf("読み込みサイズがおかしふぃ(%d,%d :%d,%dのはず)\n",x,y,232*2,480);
  418.         #endif
  419.         return(-2);
  420.     }
  421. } else {
  422.     if ( ImageColMode==0 ){    // 0;多値 1;二値
  423.         if ( x!=scx || y!=scy ){
  424.             #if SCERR == 1
  425.                 printf("読み込みサイズがおかしふぃ(%d,%d :%d,%dのはず)\n",x,y,scx,scy);
  426.             #endif
  427.             return(-2);
  428.         }
  429.     } else {
  430.         if ( (x&0xFFF8)!=((scx+7)&0xFFF8) || y!=scy ){
  431.             #if SCERR == 1
  432.                 printf("読み込みサイズがおかしふぃ(%d,%d :%d,%dのはず)\n",x,y,scx,scy);
  433.             #endif
  434.             return(-2);
  435.         }
  436.         x=scx;
  437.     }
  438. }
  439. //printf("主走査 = %d,複走査 = %d\n",x,y);
  440. //--- バッファサイズ計算
  441. if ( pr==0 ){
  442.     //============================= プリスキャン
  443.     MM=PreData;
  444.     PreDataMd=md;
  445.     xxx=232;
  446.     yyy=480;
  447.     x_=xxx;
  448. } else {
  449.     //=========================== 本番
  450.     DataC=FullColor;
  451.     if ( md!=5 && md!=2 )
  452.         DataC=0;
  453.     if ( mat_vadds!=0 ){
  454.         FullColor=0;        // 0;64k color  1;24bit color
  455.         DataC=0;
  456.     }
  457.     DataMd=md;
  458.     xxx=DataX;
  459.     yyy=DataY;
  460.     x_=xxx;
  461.     y_=yyy;
  462.     //----- 記憶用のメモリ
  463.     if ( DataC==0 ){
  464.         //--- 64k color
  465.         if ( mat_vadds==0 ){
  466.             if ( ImageDirec==0 ){
  467.                 x_=(x_+7)&0xFFF8;
  468.                 if ( x_<512 )
  469.                     x_=512;
  470.             } else {
  471.                 y_=(y_+7)&0xFFF8;
  472.                 if ( y_<512 )
  473.                     y_=512;
  474.             }
  475.             MM=_dos_malloc( x_*y_*2 );
  476.         } else {
  477.             // MAT の仮想画面
  478.             x_=mat_xwidth;
  479.             y_=mat_xwidth;    //
  480.             MM=mat_vadds;
  481.         }
  482.     } else {
  483.         //--- 24bit color
  484.         if ( md==5 )                // フルカラー
  485.             i=3;
  486.         else    i=1;                // グレイスケール
  487.         MM=_dos_malloc( x_*y_*i );
  488.     }
  489.     if ( MM>=0x81000000 ){
  490.         // 確保出来なかった
  491.         return(-4);
  492.     }
  493. }
  494. //--- 
  495. //printf("\r<<  xxx=%d(_=%d),yyy=%d(_=%d)  >>>",xxx,x_,yyy,y_);
  496. //--- 
  497. if ( md==5 )                // フルカラー
  498.     z=x*3;
  499. elif ( md==3 )                // 二値カラー
  500.     z=((x+7)/8) *3;
  501. elif ( md==2 )                // グレイスケール
  502.     z=x;
  503. else    z=((x+7)/8);            // 二値
  504. //----- ワーク用のメモリ
  505. if ( ReadPacketMode==0 ){    // 0;一括 1;分割
  506.     M=_dos_malloc(z*y);
  507.     //M=0x82000000;
  508.     if ( M<0x81000000 ){
  509.         // 確保出来た 一括でよんじゃえ
  510.         //printf("scanread %X byte\n",z*y);
  511.         BUSYS( i=_scsi_scanread( id,0,0,z*y,M) );
  512.         if ( i!=0 ){
  513.             #if SCERR == 1
  514.                 printf("read でエラー(%d)\n",i);
  515.             #endif
  516.             if ( i==2 ) request_disp(id);
  517.             _dos_mfree( M );
  518.             if ( pr!=0 && mat_vadds==0 )
  519.                 _dos_mfree( MM );
  520.             return(-3);
  521.         }
  522.         oln=0;
  523.     } else {
  524.         ll=z*y;
  525.         M=_dos_malloc(z*by*100);
  526.         if ( M<0x81000000 ){
  527.             // 100ライン分確保出来た
  528.             oln=100;
  529.         } else {
  530.             M=_dos_malloc(z*by*32);
  531.             if ( M<0x81000000 ){
  532.                 // 32ライン分確保出来た
  533.                 oln=32;
  534.             } else {
  535.                 M=_dos_malloc(z*by);
  536.                 if ( M<0x81000000 ){
  537.                     // 1ライン分確保出来た
  538.                     oln=1;
  539.                 } else {
  540.                     // 確保出来なかった
  541.                     if ( pr!=0 && mat_vadds==0 )
  542.                         _dos_mfree(MM);
  543.                     return(-4);
  544.                 }
  545.             }
  546.         }
  547.     }
  548. } else {
  549.     ll=z*y;
  550.     M=_dos_malloc(z*by*32);
  551.     if ( M<0x81000000 ){
  552.         // 32ライン分確保出来た
  553.         oln=32;
  554.     } else {
  555.         M=_dos_malloc(z*by);
  556.         if ( M<0x81000000 ){
  557.             // 1ライン分確保出来た
  558.             oln=1;
  559.         } else {
  560.             // 確保出来なかった
  561.             if ( pr!=0 && mat_vadds==0 )
  562.                 _dos_mfree(MM);
  563.             return(-4);
  564.         }
  565.     }
  566. }
  567. //---- 
  568. if ( PojiNegaMode!=0 ){    // 0;ポジ 1;ネガ
  569.     mm1=0;
  570.     mm2=0x1F;
  571. } else {
  572.     mm1=0x1F;
  573.     mm2=0;
  574. }
  575. //----
  576. ssp=_iocs_b_super(0);
  577. for(l=0;l<yyy;l++){
  578. //    printf("    複走査 = %d(%d)\r",l,y);
  579.     _dos_change_pr();
  580.     if ( MS_RSW()!=0 ){
  581.         //--- キャンセル ?
  582.         _iocs_home(0,0,0);
  583.         if ( Dialog("","中止しますか?","",2)==0 ){
  584.             // 中止
  585.             _dos_mfree(M);
  586.             if ( pr!=0 && mat_vadds==0 )
  587.                 _dos_mfree(MM);
  588.             BUSYS( i=_scsi_initialize(id) );
  589.             return(-9);
  590.         }
  591.         MsPat(-1);
  592.     } elif ( (_iocs_bitsns(0)&bit(1))!=0 ){
  593.         while( (_iocs_bitsns(0)&bit(1))!=0 );
  594.         _iocs_home(0,0,0);
  595.         if ( Dialog("","中止しますか?","",2)==0 ){
  596.             // 中止
  597.             _dos_mfree(M);
  598.             if ( pr!=0 && mat_vadds==0 )
  599.                 _dos_mfree(MM);
  600.             BUSYS( i=_scsi_initialize(id) );
  601.             return(-9);
  602.         }
  603.         MsPat(-1);
  604.     }
  605.     if ( oln==0 ){
  606.         N=&M[l*z*by];
  607.     } else {
  608.         if ( (l%oln)==0 ){
  609.             j=ll;
  610.             if ( j>z*by*oln )
  611.                 j=z*by*oln;
  612.             BUSYS( i=_scsi_scanread( id,0,0,j,M) );
  613.             if ( i!=0 ){
  614.                 #if SCERR == 1
  615.                     //printf("read でエラー(%d)\n",i);
  616.                 #endif
  617.                 if ( ssp>0 )
  618.                     _iocs_b_super(ssp);
  619.                 if ( i==2 ){
  620.                     i=request_disp2(id);
  621.                     sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  622.                     Dialog("JX エラーがでました。","[read]",buf,1 );
  623.                     return(-99);
  624.                 }
  625.                 return(-2);
  626.             }
  627.             ll-=j;
  628.             N=M;
  629.         } else {
  630.             N=&M[(l%oln)*z*by];
  631.         }
  632.     }
  633.     if ( pr==0 || ImageDirec==0 ){
  634.         //縦
  635.         if ( pr==0 ){
  636.             v=VADDS(0,0+16,l+16);
  637.         } else {
  638.             v=VADDS(0,0,l);
  639.             if ( l>=512 ){
  640.                 v=VADDS(0,0,l&511);
  641.                 _iocs_home(0,0,l&511);
  642.             }
  643.         }
  644.         vs=2;        // x+1
  645.         MS=&MM[ (0+(l)*x_)*2 ];
  646.         if ( md==5 )                // フルカラー
  647.             MC=&MM[ (0+(l)*x_)*3 ];
  648.         else    MC=&MM[ (0+(l)*x_) ];
  649.         mp=1;
  650.     } else {
  651.         v=VADDS(0,l,511);
  652.         if ( l>=512 ){
  653.             v=VADDS(0,l&511,511);
  654.             _iocs_home(0,l&511,0);
  655.         }
  656.         vs=-1024;    // y-1
  657.         MS=&MM[ (l+(xxx-1)*y_)*2 ];
  658.         if ( md==5 )                // フルカラー
  659.             MC=&MM[ (l+(xxx-1)*y_)*3 ];
  660.         else    MC=&MM[ (l+(xxx-1)*y_) ];
  661.         mp=-y_;
  662.     }
  663.     j=l&1;
  664.     if ( md==5 ){                // フルカラー
  665.         for(i=0;i<xxx;i++,v+=vs,j^=1){
  666.             if ( pr==0 ){
  667.                 if ( PreViewS!=0 ){
  668.                     d=(
  669.                         RG0[ N[0] ]+
  670.                         GG0[ N[x+0] ]+
  671.                         BG0[ N[x+x+0] ]
  672.                     );
  673.                 } elif ( j==0 ){
  674.                     d=(
  675.                         RG0[(N[0]+N[1])/2]+
  676.                         GG0[(N[x+0]+N[x+1])/2]+
  677.                         BG0[(N[x+x+0]+N[x+x+1])/2]
  678.                     );
  679.                 } else {
  680.                     d=(
  681.                         RG1[(N[0]+N[1])/2]+
  682.                         GG1[(N[x+0]+N[x+1])/2]+
  683.                         BG1[(N[x+x+0]+N[x+x+1])/2]
  684.                     );
  685.                 }
  686.                 N+=2;
  687.             } elif ( bx==1 ){
  688.                 if ( j==0 )
  689.                     d=RG0[N[0]]+GG0[N[x]]+BG0[N[x+x]];
  690.                 else    d=RG1[N[0]]+GG1[N[x]]+BG1[N[x+x]];
  691.                 if ( DataC!=0 ){
  692.                     MC[0]=RG_[N[0]];
  693.                     MC[1]=GG_[N[x]];
  694.                     MC[2]=BG_[N[x+x]];
  695.                     MC+=mp*3;
  696.                 }
  697.                 N++;
  698.             } else {
  699.                 rr=(N[0]+N[1]+N[x*3+0]+N[x*3+1])/4;
  700.                 gg=(N[x+0]+N[x+1]+N[x*3+x+0]+N[x*3+x+1])/4;
  701.                 bb=(N[x+x+0]+N[x+x+1]+N[x*3+x+x+0]+N[x*3+x+x+1])/4;
  702.                 if ( j==0 )
  703.                     d=RG0[rr]+GG0[gg]+BG0[bb];
  704.                 else    d=RG1[rr]+GG1[gg]+BG1[bb];
  705.                 if ( DataC!=0 ){
  706.                     MC[0]= RG_[rr];
  707.                     MC[1]= GG_[gg];
  708.                     MC[2]= BG_[bb];
  709.                     MC+=mp*3;
  710.                 }
  711.                 N+=bx;
  712.             }
  713.             if ( i<512 )
  714.                 *(UNshort*)v=d;
  715.             if ( pr==0 || DataC==0 ){
  716.                 // 68k COLOR
  717.                 *MS=d;
  718.                 MS+=mp;
  719.             }
  720.         }
  721.     } elif ( md==3 ){            // カラー2値
  722.         j=(x+7)/8;
  723.         for(i=0;i<xxx;i++,v+=vs){
  724.             k=( bx==1 )?i:i*bx;
  725.             d=RGB(
  726.                 ((N[k/8    ]&bit(7-(k&7)))!=0)?mm1:mm2,
  727.                 ((N[k/8+j  ]&bit(7-(k&7)))!=0)?mm1:mm2,
  728.                 ((N[k/8+j+j]&bit(7-(k&7)))!=0)?mm1:mm2
  729.             );
  730.             if ( i<512 )
  731.                 *(UNshort*)v=d;
  732.             if ( pr==0 || DataC==0 ){
  733.                 // 68k COLOR
  734.                 *MS=d;
  735.                 MS+=mp;
  736.             }
  737.         }
  738.     } elif ( md==2 ){            // グレイスケール
  739.         for(i=0;i<xxx;i++,v+=vs,j^=1){
  740.             if ( pr==0 ){
  741.                 if ( PreViewS!=0 ){
  742.                     d=RG0[ N[0] ];
  743.                 } elif ( j==0 ){
  744.                     d=RG0[(N[0]+N[1])/2];
  745.                 } else {
  746.                     d=RG1[(N[0]+N[1])/2];
  747.                 }
  748.                 N+=bx;
  749.             } elif ( bx==1 ){
  750.                 if ( j==0 )
  751.                     d=RG0[N[0]];
  752.                 else    d=RG1[N[0]];
  753.                 if ( DataC!=0 ){
  754.                     MC[0]= RG_[N[0]];
  755.                     MC+=mp;
  756.                 }
  757.                 N++;
  758.             } else {
  759.                 if ( j==0 )
  760.                     d=RG0[(N[0]+N[1]+N[x+0]+N[x+1])/4];
  761.                 else    d=RG1[(N[0]+N[1]+N[x+0]+N[x+1])/4];
  762.                 if ( DataC!=0 ){
  763.                     MC[0]= RG_[(N[0]+N[1]+N[x+0]+N[x+1])/4];
  764.                     MC+=mp;
  765.                 }
  766.                 N+=bx;
  767.             }
  768.             if ( i<512 )
  769.                 *(UNshort*)v=d;
  770.             if ( pr==0 || DataC==0 ){
  771.                 // 68k COLOR
  772.                 *MS=d;
  773.                 MS+=mp;
  774.             }
  775.         }
  776.     } else {
  777.         for(i=0;i<xxx;i++,v+=vs){
  778.             k=( bx==1 )?i:i*bx;
  779.             j=((N[k/8]&bit(7-(k&7)))!=0)?mm1:mm2;
  780.             d=RGB(j,j,j);
  781.             if ( i<512 )
  782.                 *(UNshort*)v=d;
  783.             if ( pr==0 || DataC==0 ){
  784.                 // 68k COLOR
  785.                 *MS=d;
  786.                 MS+=mp;
  787.             }
  788.         }
  789.     }
  790. }
  791. if ( ssp>0 )
  792.     _iocs_b_super(ssp);
  793. _dos_mfree(M);
  794. if ( pr!=0 ){
  795.     ScanData=MM;
  796.     ScanDataX=ScanDotX/DOTB;
  797.     ScanDataY=ScanDotY/DOTB;
  798.     //DataX=(ScanDataX+7)&0xFFF8;
  799.     if ( ImageDirec==0 )
  800.         DataX=x_;
  801.     else    DataX=y_;
  802. }
  803. return(0);
  804. }
  805. /**************************************************
  806.         プレスキャン画面表示
  807.     bb= 0; x1
  808.         1; x2
  809.         2; x4
  810. ************************************************/
  811. void    PreviewView()
  812. {
  813. int    i,v,l,bi,bisx,bisy;
  814. int    x,y,xx;
  815. int    ssp;
  816. int    bb;
  817. int    ofx,ofy;
  818. UNshort    *V,*M,*W;
  819. p_12_sprintf(11*16+2+8,2,"x%d",1<<PreBai);
  820. M=PreData;
  821. ofx=PrePX;
  822. ofy=PrePY;
  823. x=232-ofx;
  824. y=480-ofy;
  825. bb=PreBai;
  826.     //printf("    倍率 = %d\r",bb);
  827. ssp=_iocs_b_super(0);
  828. if ( bb>0 ){
  829.             // 1;x2  2;x4 3;x8
  830.     bi=1<<bb;
  831.     bisx=232/bi;
  832.     bisy=480/bi;
  833.     for(l=0;l<y;l++){
  834.         if ( l>=bisy )
  835.             break;
  836.         W=&M[ (ofx+(l+ofy)*232) ];
  837.         xx=x;
  838.         if ( xx>bisx )
  839.             xx=bisx;
  840.         v=VADDS(0,16,(l*bi)+16);
  841.         if ( bb==1 ){
  842.             for(i=0;i<xx;i++,v+=4)
  843.                 GG2PSET_64_S(v,*W++);
  844.         } elif ( bb==2 ){
  845.             for(i=0;i<xx;i++,v+=8)
  846.                 GG4PSET_64_S(v,*W++);
  847.         } elif ( bb==3 ){
  848.             for(i=0;i<xx;i++,v+=16)
  849.                 GG8PSET_64_S(v,*W++);
  850.         }
  851.     }
  852.     ScroolBarX(232,232/bi,ofx);
  853.     ScroolBarY(480,480/bi,ofy);
  854. } else {
  855.     M=PreData;
  856.     x=232;
  857.     y=480;
  858.     for(l=0;l<y;l++){
  859.         V=(VADDS(0,16,16)+1024*l);
  860.         for(i=0;i<x;i++)
  861.             *V++=*M++;
  862.     }
  863.     ScroolBarX(-1);
  864.     ScroolBarY(-1);
  865. }
  866. if ( ssp>0 )
  867.     _iocs_b_super(ssp);
  868. }
  869. /*************************************************
  870.     γ補正&減色データ制作
  871. *************************************************/
  872. void    MakeGammaTable(md)
  873. int    md;
  874. {
  875. int    i,j,m,n;
  876. double    a,b;
  877. if ( md==5 ){
  878.     // カラー
  879.     for(i=0;i<256;i++){
  880.         b=(double)GammaR/100.;
  881.         a=(pow((double)i/255.,(1./b)))*255;
  882.         m=(int)a;
  883.         RG_[i]=m;
  884.         n=m>>3;
  885.         j=( (m&0x7)<4 || n>=0x1F )?0:1;
  886.         RG0[i]=RGB(n  ,0,0);
  887.         if ( C64halfMode==0 )    // 0;中間処理あり 1;なし
  888.             RG1[i]=RGB(n+j,0,0);
  889.         else    RG1[i]=RG0[i];
  890.         //
  891.         b=(double)GammaG/100.;
  892.         a=(pow((double)i/255.,(1./b)))*255;
  893.         m=(int)a;
  894.         GG_[i]=m;
  895.         n=m>>3;
  896.         j=( (m&0x7)<4 || n>=0x1F )?0:1;
  897.         GG0[i]=RGB(0,n  ,0);
  898.         if ( C64halfMode==0 )    // 0;中間処理あり 1;なし
  899.             GG1[i]=RGB(0,n+j,0);
  900.         else    GG1[i]=GG0[i];
  901.         //
  902.         b=(double)GammaB/100.;
  903.         a=(pow((double)i/255.,(1./b)))*255;
  904.         m=(int)a;
  905.         BG_[i]=m;
  906.         n=m>>3;
  907.         j=( (m&0x7)<4 || n>=0x1F )?0:1;
  908.         BG0[i]=RGB(0,0,n  );
  909.         if ( C64halfMode==0 )    // 0;中間処理あり 1;なし
  910.             BG1[i]=RGB(0,0,n+j);
  911.         else    BG1[i]=BG0[i];
  912.         if ( PojiNegaMode!=0 ){    // 0;ポジ 1;ネガ
  913.             RG0[i]=RGB(31,0,0)-RG0[i];
  914.             RG1[i]=RGB(31,0,0)-RG1[i];
  915.             GG0[i]=RGB(0,31,0)-GG0[i];
  916.             GG1[i]=RGB(0,31,0)-GG1[i];
  917.             BG0[i]=RGB(0,0,31)-BG0[i];
  918.             BG1[i]=RGB(0,0,31)-BG1[i];
  919.             RG_[i]=255-RG_[i];
  920.             GG_[i]=255-GG_[i];
  921.             BG_[i]=255-BG_[i];
  922.         }
  923.     }
  924. } elif ( md==2 ) {
  925.     // グレイスケール
  926.     for(i=0;i<256;i++){
  927.         b=(double)GammaM/100.;
  928.         a=(pow((double)i/255.,(1./b)))*255;
  929.         m=(int)a;
  930.         RG_[i]=m;
  931.         n=m>>3;
  932.         j=( (m&0x7)<4 || n>=0x1F )?0:1;
  933.         RG0[i]=RGB(n  ,n  ,n  );
  934.         if ( C64halfMode==0 )    // 0;中間処理あり 1;なし
  935.             RG1[i]=RGB(n+j,n+j,n+j);
  936.         else    RG1[i]=RG0[i];
  937.         if ( PojiNegaMode!=0 ){    // 0;ポジ 1;ネガ
  938.             RG0[i]=0xFFFE-RG0[i];
  939.             RG1[i]=0xFFFE-RG1[i];
  940.             RG_[i]=255-RG_[i];
  941.         }
  942.     }
  943. } elif ( md==0 ) {
  944.     //γ補正無し変換用(24bit->64k)
  945.     for(i=0;i<256;i++){
  946.         m=i;
  947.         RG_[i]=m;
  948.         n=m>>3;
  949.         j=( (m&0x7)<4 || n>=0x1F )?0:1;
  950.         RG0[i]=RGB(n,0,0);
  951.         GG0[i]=RGB(0,n,0);
  952.         BG0[i]=RGB(0,0,n);
  953.         if ( C64halfMode==0 ){    // 0;中間処理あり 1;なし
  954.             RG1[i]=RGB(n+j,0,0);
  955.             GG1[i]=RGB(0,n+j,0);
  956.             BG1[i]=RGB(0,0,n+j);
  957.         } else {
  958.             RG1[i]=RG0[i];
  959.             GG1[i]=GG0[i];
  960.             BG1[i]=BG0[i];
  961.         }
  962.     }
  963. }
  964. return;
  965. }
  966.